home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 August: Tool Chest / Dev.CD Aug 98 TC.toast / Sample Code / Interapplication Communication / MenuScripter 4.0 / Sources / MSAEMove.c < prev    next >
Encoding:
Text File  |  1996-07-09  |  4.6 KB  |  181 lines  |  [TEXT/CWIE]

  1. // MSAEMove.c
  2. //
  3. // Original version by Jon Lansdell and Nigel Humphreys.
  4. // 4.0 and 3.1 updates by Greg Sutton.
  5. // Â©Apple Computer Inc 1996, all rights reserved.
  6.  
  7. /*
  8.     14-Nov-95 : GS : Disposed of all interim descriptors in DoMove() and MoveTextToken().
  9. */
  10.  
  11. #include "MSAEMove.h"
  12.  
  13. #include "MSAEUtils.h"
  14. #include "MSWindow.h"        // for DPtrFromWindowPtr()
  15. #include "MSAETextUtils.h"
  16.  
  17. #include "MSAEDelete.h"
  18. #include "MSAECreate.h"
  19. #include "MSAEGetData.h"
  20.  
  21.  
  22. #pragma segment AppleEvent
  23.  
  24.  
  25. pascal OSErr    DoMove(const AppleEvent *theAppleEvent, AppleEvent *reply, long  handlerRefCon)
  26. {
  27. #ifdef __MWERKS__
  28.     #pragma unused(handlerRefCon)
  29. #endif
  30.  
  31.     AEDesc        directObj = {typeNull, NULL},
  32.                 insertHereDesc = {typeNull, NULL},
  33.                 resultDesc = {typeNull, NULL};
  34.     OSErr        err;
  35.  
  36.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  37.     if (noErr != err) goto done;
  38.  
  39.     err = AEGetParamDesc(theAppleEvent, keyAEInsertHere, typeWildCard, &insertHereDesc);
  40.     if (noErr != err) goto done;
  41.  
  42.         // missing any parameters?
  43.     err = GotRequiredParams(theAppleEvent);
  44.     if (noErr != err) goto done;
  45.     
  46.     err = MoveDesc(&directObj, &insertHereDesc, &resultDesc);
  47.     if (noErr != err) goto done;
  48.     
  49.     err = AddResultToReply(&resultDesc, reply, err);
  50.  
  51. done:
  52.     (void)AEDisposeDesc(&directObj);
  53.     (void)AEDisposeDesc(&insertHereDesc);
  54.     (void)AEDisposeDesc(&resultDesc);
  55.         
  56.     return(err);
  57. }
  58.  
  59. OSErr    MoveTextToken(TextToken* token, AEDesc* insertHereDesc, AEDesc* result)
  60. {
  61.     TextToken        insertAtToken;
  62.     AEDesc            dataDesc = {typeNull, NULL},
  63.                     insertDesc = {typeNull, NULL},
  64.                     propertyDesc = {typeNull, NULL};    // Use to pass no properties
  65.     DescType        insertType;
  66.     short            numPartial;
  67.     OSErr            err;
  68.  
  69.                         // Get the data descriptor to insert
  70.     err = GetTextTextProperty(token, &dataDesc);
  71.     if (noErr != err) goto done;
  72.  
  73.                         // Get the place to insert it
  74.      err = GetInsertDescFromInsertHere(insertHereDesc, &insertDesc, &insertType);
  75.     if (noErr != err) goto done;
  76.     
  77.     if (typeNull == insertType)        // Default to setting the selection in the front window
  78.         err = errAETypeError;        // GetWindowSelection(FrontWindow(), &insertAtToken, &oldLength);
  79.     else                            // Otherwise get a selection from the insertDesc
  80.         err = GetInsertToken(&insertDesc, insertType, &insertAtToken);
  81.         
  82.     if (noErr != err) goto done;
  83.     
  84.                         // Sort out any moving onto self scenarios
  85.                         // and offsets changing due to deletion of where it was
  86.     switch (TokenWithinToken(token, &insertAtToken, &numPartial))
  87.     {
  88.         case kTokenBefore:
  89.                     // Do Nothing
  90.             break;
  91.  
  92.         case kTokenAfter:
  93.                     // Balance up for delete
  94.             insertAtToken.tokenOffset -= token->tokenLength;
  95.             break;
  96.             
  97.         case kTokenWithin:
  98.                     //    tell document 1 of application "MenuScripter"
  99.                     //        move first word to last character of first word
  100.                     //    end tell
  101.             insertAtToken.tokenOffset = token->tokenOffset;
  102.             insertAtToken.tokenLength = 0;
  103.             break;
  104.  
  105.         case kTokenPartialBefore:
  106.             insertAtToken.tokenLength -= numPartial;
  107.             break;
  108.             
  109.         case kTokenPartialAfter:
  110.             insertAtToken.tokenOffset = token->tokenOffset;
  111.             insertAtToken.tokenLength -= numPartial;
  112.             break;
  113.     }
  114.     
  115.                 // Delete the text to be moved
  116.     err = DeleteTextToken(token);
  117.     if (noErr != err) goto done;
  118.     
  119.                 // Secondly create the text wherever
  120.     err = CreateAtTextToken(cText, &dataDesc, &insertAtToken, &propertyDesc, result);
  121.     if (noErr != err) goto done;
  122.  
  123. done:
  124.     (void)AEDisposeDesc(&dataDesc);
  125.     (void)AEDisposeDesc(&insertDesc);
  126.  
  127.     return(err);
  128. }
  129.  
  130. OSErr    MoveTextDesc(AEDesc* textDesc, AEDesc* insertHereDesc, AEDesc* result)
  131. {
  132.     TextToken        aTextToken;
  133.     Size            actualSize;
  134.     OSErr            err;
  135.  
  136.     if (typeMyText != textDesc->descriptorType)
  137.         return(errAETypeError);
  138.         
  139.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  140.     
  141.     err = MoveTextToken(&aTextToken, insertHereDesc, result);
  142.     
  143.     return(err);
  144. }
  145.  
  146. OSErr    MoveDesc(AEDesc* aDesc, AEDesc* insertHereDesc, AEDesc* result)
  147. {
  148.     AEDesc        moveDesc = {typeNull, NULL},
  149.                 textDesc = {typeNull, NULL};
  150.     OSErr        err;
  151.     
  152.     if (typeObjectSpecifier == aDesc->descriptorType)
  153.         err = AEResolve(aDesc, kAEIDoMinimum, &moveDesc);
  154.     else if (typeNull != aDesc->descriptorType)
  155.         err = AEDuplicateDesc(aDesc, &moveDesc);
  156.         
  157.     if (noErr != err) goto done;
  158.     
  159.     switch (moveDesc.descriptorType)
  160.     {
  161.         case typeAEList:
  162.             err = errAETypeError;
  163.             // We can't handle moving more than one item because as
  164.             // soon as one item is moved all the rest of the tokens
  165.             // are likely to have their offsets messed up.
  166.             // No doubt it can be done though…
  167.             break;
  168.             
  169.         default:
  170.             err = AECoerceDesc(&moveDesc, typeMyText, &textDesc);
  171.             if (noErr != err) goto done;
  172.             err = MoveTextDesc(&textDesc, insertHereDesc, result);
  173.     }
  174.     
  175. done:
  176.     (void)AEDisposeDesc(&moveDesc);
  177.     (void)AEDisposeDesc(&textDesc);
  178.     
  179.     return(err);
  180. }
  181.